package com.hsurosy.hsuchain.nft.gateway.auth;

import cn.dev33.satoken.stp.StpInterface;
import cn.dev33.satoken.stp.StpUtil;
import com.hsurosy.hsuchain.nft.api.user.constant.UserPermission;
import com.hsurosy.hsuchain.nft.api.user.constant.UserRole;
import com.hsurosy.hsuchain.nft.api.user.constant.UserStateEnum;
import com.hsurosy.hsuchain.nft.api.user.response.data.UserInfo;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 自定义权限验证接口的实现类
 *
 * @Author Hsu琛君珩
 * @Date 2024-10-06 16:45
 * @Description
 * @Version: v1.0.0
 */
@Component
public class StpInterfaceImpl implements StpInterface {

    /**
     * 获取用户的权限列表
     *
     * @param loginId 登录用户的ID
     * @param loginType 登录类型
     * @return 用户权限列表
     */
    @Override
    public List<String> getPermissionList(Object loginId, String loginType) {
        // 获取当前登录用户的UserInfo对象
        UserInfo userInfo = (UserInfo) StpUtil.getSessionByLoginId(loginId).get((String) loginId);

        // 如果用户是管理员，或状态为ACTIVE、AUTH，则返回BASIC和AUTH权限
        if (userInfo.getUserRole() == UserRole.ADMIN ||
                userInfo.getState().equals(UserStateEnum.ACTIVE.name()) ||
                userInfo.getState().equals(UserStateEnum.AUTH.name())) {
            return List.of(UserPermission.BASIC.name(), UserPermission.AUTH.name());
        }

        // 如果用户状态是INIT，返回BASIC权限
        if (userInfo.getState().equals(UserStateEnum.INIT.name())) {
            return List.of(UserPermission.BASIC.name());
        }

        // 如果用户状态是FROZEN，返回FROZEN权限
        if (userInfo.getState().equals(UserStateEnum.FROZEN.name())) {
            return List.of(UserPermission.FROZEN.name());
        }

        // 如果没有匹配的状态，返回NONE权限
        return List.of(UserPermission.NONE.name());
    }

    /**
     * 获取用户的角色列表
     *
     * @param loginId 登录用户的ID
     * @param loginType 登录类型
     * @return 用户角色列表
     */
    @Override
    public List<String> getRoleList(Object loginId, String loginType) {
        // 获取当前登录用户的UserInfo对象
        UserInfo userInfo = (UserInfo) StpUtil.getSessionByLoginId(loginId).get((String) loginId);

        // 如果用户是管理员，返回ADMIN角色
        if (userInfo.getUserRole() == UserRole.ADMIN) {
            return List.of(UserRole.ADMIN.name());
        }

        // 默认返回用户的角色为CUSTOMER
        return List.of(UserRole.CUSTOMER.name());
    }
}
